package main

import "fmt"

// 声明全局变量(包级变量)
var num1 = 1
var num2 = 2

// 通过变量声明块,声明多个全局变量(包级变量)
var (
	str1 = "a"
	str2 = "b"
)

// 常量声明
// 首字符的大小写来控制访问范围,首字符大写为导出(Exported)变量,包外可访问
// 首字符小写为内部变量,仅在包内可访问
const (
	Exported = "导出变量"
	Internal = "内部变量"
)

// 通过常量+iota构建枚举
// iota代表行偏移量,每行递增1。主动赋值会将iota中断
const (
	Status1 = 1 << iota
	Status2
	Status4
	Status8
)

func main() {
	//useVariable()
	//printZeroValue()
	blockDeclare()
	//declareVariable()
	//multiVariable()
	//printPackageVariable()
	//printEnums()
}

// 声明变量的几种方式
// 在方法体内部声明的变量,均为局部变量
func declareVariable() {
	//方式一：完整变量声明,并赋予初始值
	//var 变量名 变量类型 = 初始值
	var n1 int = 1
	fmt.Println("n1 = ", n1)

	//方式二：完整变量声明,但不赋予初始值,此时编译器会将变量自动设置为对应类型的零值(默认值)
	var n2 int //n2=0
	fmt.Println("n2 = ", n2)

	//方式三：采用类型推断(Type Deduction),省略变量类型,由编译器自动推断
	var n3 = 3
	fmt.Println("n3 = ", n3) //通过类型推断,n3为int类型

	//方式四：短变量声明
	//变量名 := 初始值
	//此时也有编译器进行类型推断
	n4 := 4 //通过类型推断,n4为int类型
	fmt.Println("n4 = ", n4)
}

// 变量的使用
func useVariable() {
	//使用变量的步骤
	//1. 变量声明
	var age int

	//2. 变量赋值
	age = 18

	//3.变量使用
	fmt.Println("age= ", age)
}

// 同时声明多个变量
func multiVariable() {
	//通过完整变量声明,同时声明多个变量
	var n1, n2, n3 int = 1, 2, 3
	fmt.Printf("n1 = %d\tn2 = %d\tn3 = %d\n", n1, n2, n3)

	//通过短变量声明,同时声明多个变量
	s1, s2, s3 := "a", "b", "c"
	fmt.Printf("s1 = %s\ts2 = %s\ts3 = %s\n", s1, s2, s3)
}

func printPackageVariable() {
	fmt.Printf("num1 = %d\tnum2 = %d\n", num1, num2)
	fmt.Printf("str1 = %s\tstr2 = %s\n", str1, str2)
}

// 通过const+iota构建枚举
func printEnums() {
	fmt.Printf("Status1=%d\t,Status2=%d\t,Status4=%d\t,Status8=%d\n", Status1, Status2, Status4, Status8)
}
